-- 参数：限流键、桶容量、速率
local key = KEYS[1]
local capacity = tonumber(ARGV[1])
local rate = tonumber(ARGV[2])

-- 参数验证
if not capacity or not rate or capacity <= 0 or rate <= 0 then
    return 0
end

-- 获取当前时间戳（毫秒）
local t = redis.call('TIME')
local now = t[1] * 1000 + t[2] / 1000

-- 获取当前桶状态
local bucket = redis.call('HMGET', key, 'tokens', 'last_refill')
local tokens = tonumber(bucket[1]) or capacity
local last_refill = tonumber(bucket[2]) or now

-- 计算需要补充的令牌数
local delta = math.max(0, now - last_refill)
local added_tokens = delta * rate / 1000.0
tokens = math.min(capacity, tokens + added_tokens)

-- 尝试消费令牌
local allowed = 0
if tokens >= 1.0 then
    tokens = tokens - 1.0
    allowed = 1
end

-- 更新桶状态（只在有变化时更新）
if allowed == 1 or delta > 0 then
    redis.call('HMSET', key, 'tokens', tokens, 'last_refill', now)
    redis.call('EXPIRE', key, 3600)  -- 1小时过期
end

return allowed